<?php
/* Última Modificación : 11 de Abril de 2012
 * Author : Hector Hidalgo Sepulveda
 * Mejorado por: Pablo Jacobi Inostroza
 * Re-mejorado y documentado por: Roberto Poo
 * Contacto: hhidalgo@inf.utsfm.cl
 * Web Site: http://www.alumnos.inf.utfsm.cl/~hhidalgo/
 * Todos los derechos Reservados : Hhidalgo
 * Version Beta, con poco testing.
 * Cualquier mejora, favor avise a sus ayudantes :)
 */
 
require_once('includes/config.php');

/*
 * Clase que implementa la interacción genérica y
 * directa con la base de datos.
 */
class BaseDatos {

	function BaseDatos() {
	}

	/*
	 * Realiza la conexión a la base de datos.
	 */
	function connectClass() {		
		global $strings, $oConn, $databaseType;
		if(!isset($oConn)) {
			$oConn = pg_connect("dbname=".MYDATABASE." host=".MYSERVER." user=".MYLOGIN." password=".MYPASSWORD." port=".MYPORT) or die($strings["error_server"]);			
		}
	}

	/*
	 * Ejecuta en la base de datos la query entregada.
	 * Se debe abrir manualmente una conexión a la base de datos 
	 * (con connectClass()) antes de ejecutar la query.
	 *
	 * $sql: Query SQL a ejecutar.
	 *
	 * Retorna el resultado de la query (en un arreglo
	 * que se debe recorrer utilizando fetch()).
	 */
	function query($sql) {
		$this->connectClass();
		global $oConn;
					
		$this->sql = $sql;
		$this->result = pg_query($oConn, $sql);
		
		return $this->result;
	}
	
	/*
	 * Obtiene una fila del resultado de la query entregado.
	 * Cada vez que se llama se obtiene la siguiente fila,
	 * hasta que se acaban las filas del resultado. 
	 *
	 * $result: Resultado de la ejecución de una query
	 * a la base de datos (ver query()).
	 *
	 * Retorna un arreglo con los datos de una fila del
	 * resultado, o null si es que ya no quedan filas por
	 * retornar.
	 */
	function fetch($result) {
		
		//Mejorar manejo de errores
		if (!$result) {
			echo "Ha ocurrido un error con la base de datos.<br>";
			echo pg_result_error($row)."<br><br>";
			echo "La consulta que falló es: \"".$this->sql."\"<br>"; //errorhandler.me(error)
			exit;
		}
		
		$row = pg_fetch_array($result);
		return $row;
	}

	/*
	 * Cierra la conexión con la base de datos.
	 * Se debe llamar después de realizar una query
	 * y ya no se necesite la conexión.
	 */
	function close() {
		$this->connectClass();
		global $oConn;

		pg_free_result($this->result);
		pg_close($oConn);
	}

	/*
	 * Ejecuta una query para inserción de datos
	 * a la base de datos.
	 * Se debe abrir manualmente una conexión a la base de datos 
	 * (con connectClass()) antes de ejecutar la query.
	 * 
	 * $query: Query INSERT.
	 *
	 * Retorna true si se logró insertar los datos.
	 */
	function insertbd($query){

		global $sql;
		
		$sql = $query;
		$result = $this->query($sql);
		
		if ($result){
			return true;
		}else{
			global $msg; 
			$msg = $sql;
			return false;
		}
	}

	/*
	 * Ejecuta una query para actualizar datos en la base de datos.
	 * Se debe abrir manualmente una conexión a la base de datos 
	 * (con connectClass()) antes de ejecutar la query.
	 * 
	 * $query: Query UPDATE.
	 *
	 * Retorna true si se logró actualizar los datos.
	 */
	function updatebd($sqlquery){
	
		global $sql;		
		$sql = $sqlquery;
		
		$this->query($sql);

		if($this->result){
			return true;
		}else{
			return false;
		}
	}	

	/*
	 * Ejecuta una query para eliminar datos de la base de datos.
	 * Se debe abrir manualmente una conexión a la base de datos 
	 * (con connectClass()) antes de ejecutar la query.
	 * 
	 * $query: Query DELETE.
	 *
	 * Retorna true si se logró borrar los datos.
	 */
	function deletebd($sqlquery){
		return $this->insertbd($sqlquery);
	}

	/*
	 * Cuenta el número de filas del resultado.
	 *
	 * $result: Resultado de un query (ver query()).
	 *
	 * Retorna el número de filas contenidas en $result.
	 */
	function numRows($result) {
		return pg_num_rows($result); 		
	}

}
?>
